package Test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

public class MessageTest {
    public static void main(String[] args) {
        try {
            testRestful("http://http://36.155.115.9:10086"); //OA地址
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
        }
    }

    /**
     * APPID 指定一个UUID （请记住是指定一个UUID，作为第三方系统的唯一标识）
     */
    private static final String APPID = "EEAA5436-7577-4BE0-8C6C-89E9D88805EA";

    /**
     * 发送消息，参数封装
     *
     * @return
     */
    public static Map<String, String> sendCustomMessageSingle() {
        Map<String, String> map = new HashMap<>();
        map.put("code", "558"); // 消息来源,新建消息来源获取code 请查看文档第四大点补充
        map.put("userIdList", "1,3"); // userIdList参数 userIdList 接收人OA系统id / loginIdList 接收人登录名 / workCodeList 接收人编号 / lastNameList 接收人姓名（任选一个填入即可，以逗号分隔）
        //      map.put("loginIdList","zhangsan,wangwu" ); //接收人登录名
        //        map.put("workCodeList","WS01640,WS01641" ); //接收人编号
        map.put("lastNameList", "张三"); //接收人姓名
        map.put("creater", "1"); //creater的值 创建人OA系统id / 创建人登录名 / 创建人编号 / 创建人姓名（对应接收人所传入的形式）
        //        map.put("creater","zhangsan");
        //        map.put("creater","WS01640");
        map.put("creater", "张三");
        map.put("title", "标题");
        map.put("context", "内容");
        map.put("linkUrl", "PC端链接");
        map.put("linkMobileUrl", "移动端链接");
        //        map.put("targetId","559|id22"); //消息来源code +“|”+业务id  消息需要打上已处理标记
        //        map.put("bizState","0"); //0 表示消息初始状态是待处理  消息需要打上已处理标记
        return map;
    }

    /**
     * 通过获取到的token请求发消息,修改消息，删除消息接口
     *
     * @param address OA地址
     * @return
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    public static String testRestful(String address) throws NoSuchAlgorithmException, KeyManagementException {
        Map<String, String> heads = new HashMap<>();
        //ECOLOGY返回的token
        //封装参数到请求头
        heads.put("appid", APPID);
        heads.put("token", "f6363839-ce29-4bda-9276-ac44e8836c62");
        heads.put("skipsession", "1");
        //调用ECOLOGY系统发消息接口，消息推送接口返回为true，代表消息成功加入缓存，实际消息是否发送成功，请查看OA后台消息推送日志，和EM消息日志
        String data = post(address + "/api/ec/dev/message/sendCustomMessageSingle", sendCustomMessageSingle(), heads);
        //调用ECOLOGY系统修改消息接口，将消息打上已处理标记
        //        String data = post(address + "/api/ec/dev/message/alterCustomMessageSingle",alterCustomMessageSingle(), heads);
        //调用ECOLOGY系统删除消息接口，将消息删除
        //        String data = post(address + "/api/ec/dev/message/deleteCustomMessageSingle",deleteCustomMessageSingle(), heads);
        System.out.println("testRestful：" + data);
        return data;
    }



    /**
     * 此方法仅供参考，第三方系统可采用自己的方式调用http接口
     *
     * @param path 请求路径
     * @param data 请求参数
     * @return
     */
    public static String post(String path, Map<String, String> params, Map<String, String> data) {
        try {
            String str = "";
            //            if (params != null) {
            //                StringBuilder stringBuilder = new StringBuilder("?");
            //                for (Map.Entry<String, String> entry : params.entrySet()) {
            //                    stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            //                }
            //                if (stringBuilder.length() > 1)
            //                    path += stringBuilder.substring(0, stringBuilder.length() - 1);
            //            }
            URL url = new URL(path);
            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //            PrintWriter out = null;
            // 请求参数 编码为 utf-8
            //请求方式
            conn.setRequestMethod("POST");
            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            if (data != null){
                for (Map.Entry<String, String> entry : data.entrySet()) {
                    conn.setRequestProperty(entry.getKey(), entry.getValue());
                    //设置是否向httpUrlConnection输出，设置是否从httpUrlConnection读入，此外发送post请求必须设置这两个
                    //最常用的Http请求无非是get和post，get请求可以获取静态页面，也可以把参数放在URL字串后面，传递给servlet，
                    //post与get的 不同之处在于post的参数不是放在URL字串里面，而是放在http请求的正文内。
                    conn.setDoOutput(true);
                    conn.setDoInput(true);
                    OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
                    if (params != null) {
                        out.write(mapToStr(params));
                    }

                    //缓冲数据
                    out.flush();
                    out.close();
                    //获取URLConnection对象对应的输入流
                    InputStream is = conn.getInputStream();
                    //构造一个字符流缓存
                    BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
                    String result = "";
                    while ((str = br.readLine()) != null) {
                        result = str;
                    }

                //关闭流
                is.close();
                //断开连接，最好写上，disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
                //固定多线程的话，如果不disconnect，链接会增多，直到收发不出信息。写上disconnect后正常一些。
                conn.disconnect();

                return result;
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将Map转换成字符串参数，用于POST GET 请求
     *
     * @param map
     * @return
     */
    public static String mapToStr(Map<String, String> map) {
        StringBuilder stringBuilder = new StringBuilder();
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                stringBuilder.append(entry.getKey());
                if (entry.getValue() != null) {
                    stringBuilder.append("=").append(entry.getValue());
                    stringBuilder.append("&");
                }
            }
        }
        if (stringBuilder.length() > 0) {
            return stringBuilder.substring(0, stringBuilder.length() - 1);
        }
        return null;
    }
}